Skip to content
c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=20005,LOG = 20; 
int dep[N<<1], up[N<<1][LOG];
std::vector<int>g[N],adj[N<<1];
int n,m,tot;
int dfn[N],low[N],timer;
int stk[N],top;
void add(int u,int v){
    adj[u].push_back(v);
    adj[v].push_back(u);
}
void tarjan(int u){
    dfn[u]=low[u]=++timer;
    stk[++top]=u;
    for(int v:g[u]){
        if(!dfn[v]){
            tarjan(v);
            low[u]=std::min(low[u],low[v]);
            if(low[v]>=dfn[u]){
                int sq=++tot;
                add(sq,u);
                do{
                    add(sq,stk[top]);
                }while(stk[top--]!=v);
            }
        }else{
            low[u]=std::min(low[u],dfn[v]);
        }
    }
}
void dfs(int u, int p) {
    dep[u] = dep[p] + 1;
    up[u][0] = p;
    for (int i = 1; i < LOG; ++i)
        up[u][i] = up[up[u][i - 1]][i - 1];
    for (int v : adj[u])
        if (v != p) dfs(v, u);
}

int lca(int u,int v){
    if(dep[u]<dep[v])std::swap(u,v);
    int d=dep[u]-dep[v];
    for(int i=0;i<LOG;i++)
        if((d>>i)&1)u=up[u][i];
    if(u==v)return u;
    for(int i=LOG-1;i>=0;i--)
        if(up[u][i]!=up[v][i])
            u=up[u][i],v=up[v][i];
    return up[u][0];
}

bool check(int u,int w,int f){
    return lca(u,w)==w&&lca(w,f)==f;
}
void fc() {
    std::cin>>n>>m;
    for(int i=0;i<m;i++){
        int u,v;std::cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    tot=n;
    tarjan(1);
    dfs(1,0);

    int q;std::cin>>q;
    while(q--){
        int u,v,w;std::cin>>u>>v>>w;
        int f=lca(u,v);
        std::cout<<(check(u,w,f)||check(v,w,f)?"yes":"no")<<"\n";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    //std::cin>>t;
    while (t--) fc();
    return 0;
}